// 4-2 c++信号处理-raise()函数
/**
 * C++ 信号处理
 * 信号是由操作系统传给进程的中断，会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上，可以通过按 Ctrl+C 产生中断。

 * 有些信号不能被程序捕获，但是下表所列信号可以在程序中捕获，并可以基于信号采取适当的动作。这些信号是定义在 C++ 头文件 <csignal> 中。
  
    信号	      描述
    SIGABRT	    程序的异常终止，如调用 abort。
    SIGFPE	    错误的算术运算，比如除以零或导致溢出的操作。
    SIGILL	    检测非法指令。
    SIGINT	    程序终止(interrupt)信号。
    SIGSEGV	    非法访问内存。
    SIGTERM	    发送到程序的终止请求。
 *
 *---------------------------
 * raise() 函数
 * 您可以使用函数 raise() 生成信号，该函数带有一个整数信号编号作为参数，语法如下：

      int raise (signal sig);

 * 在这里，sig 是要发送的信号的编号，这些信号包括：SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP。以下是我们使用 raise() 函数内部生成信号的实例：
*/

#include <iostream>
#include <csignal>
// #include <unistd.h>
#include <windows.h>
void signalhandler(int signum)
{
  std::cout << "Interrput signal (" << signum << ") recevied !" << std::endl;
  // 清理并关闭
  // 中止程序
  exit(signum);
}
int main(void)
{
  std::signal(SIGINT, signalhandler);
  // std::signal(111111111, signalhandler); // 无效
  int i = 0;
  while (1)
  {
    // sleep(1);// unix unistd.h 单位s
    Sleep(1000); // window windows.h 单位ms
    std::cout << "go to sleep..." << std::endl;
    if (i++ == 3)
    {
      std::raise(SIGINT);
      // std::raise(111111111); // 无效
    }
  }

  printf("------------end----------------\n");
  return 0;
}